/*!
 * \file WtDataManager.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 数据管理器头文件
 * 
 * \details 本文件定义了WonderTrader数据服务系统的数据管理器类WtDataManager：
 *          - 实现IRdmDtReaderSink接口，提供数据读取回调功能
 *          - 管理历史数据和实时数据的访问和缓存
 *          - 支持K线数据、Tick数据、Level2数据的查询
 *          - 提供按时间范围和数量的数据切片功能
 *          - 实现数据缓存机制，提高查询性能
 *          - 集成基础数据管理器和热点管理器
 *          - 支持多种K线周期和数据格式
 */
#pragma once
#include <vector>
#include <stdint.h>

#include "../Includes/IDataManager.h"
#include "../Includes/IRdmDtReader.h"
#include "../Includes/FasterDefs.h"
#include "../Includes/WTSCollection.hpp"


class WtDtRunner;

NS_WTP_BEGIN
class WTSVariant;
class WTSTickData;
class WTSKlineSlice;
class WTSKlineData;
class WTSTickSlice;
class IBaseDataMgr;
class IHotMgr;
class WTSSessionInfo;
struct WTSBarStruct;

/**
 * @class WtDataManager
 * @brief 数据管理器类
 * @details 负责管理WonderTrader数据服务系统的数据访问和缓存：
 *          - 实现数据读取器回调接口
 *          - 提供历史数据和实时数据的统一访问
 *          - 管理K线数据缓存，提高查询效率
 *          - 支持多种数据切片查询方式
 *          - 集成基础数据和热点数据管理
 */
class WtDataManager : public IRdmDtReaderSink
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化数据管理器
	 */
	WtDataManager();
	
	/**
	 * @brief 析构函数
	 * @details 清理数据管理器资源
	 */
	~WtDataManager();

private:
	/**
	 * @brief 初始化数据存储
	 * @details 根据配置初始化数据存储相关组件
	 * @param cfg 配置参数
	 * @return bool 初始化是否成功
	 */
	bool	initStore(WTSVariant* cfg);

	/**
	 * @brief 获取交易时段信息
	 * @details 根据时段ID或合约代码获取交易时段信息
	 * @param sid 时段ID或合约代码
	 * @param isCode 是否为合约代码
	 * @return WTSSessionInfo* 交易时段信息指针
	 */
	WTSSessionInfo* get_session_info(const char* sid, bool isCode = false);

//////////////////////////////////////////////////////////////////////////
//IRdmDtReaderSink
public:
	/**
	 * @brief 获取基础数据管理器接口指针
	 * @details 实现IRdmDtReaderSink接口，返回基础数据管理器
	 * @return IBaseDataMgr* 基础数据管理器指针
	 */
	virtual IBaseDataMgr*	get_basedata_mgr() override { return _bd_mgr; }

	/**
	 * @brief 获取热点合约管理器接口指针
	 * @details 实现IRdmDtReaderSink接口，返回热点管理器
	 * @return IHotMgr* 热点管理器指针
	 */
	virtual IHotMgr*		get_hot_mgr() override { return _hot_mgr; }

	/**
	 * @brief 数据读取模块日志
	 * @details 实现IRdmDtReaderSink接口，处理数据读取器的日志输出
	 * @param ll 日志级别
	 * @param message 日志消息
	 */
	virtual void			reader_log(WTSLogLevel ll, const char* message) override;

public:
	/**
	 * @brief 初始化数据管理器
	 * @details 根据配置参数初始化数据管理器及相关组件
	 * @param cfg 配置参数
	 * @param runner 数据运行器指针
	 * @return bool 初始化是否成功
	 */
	bool	init(WTSVariant* cfg, WtDtRunner* runner);

	/**
	 * @brief 处理推送的行情数据
	 * @details 处理实时推送的tick行情数据
	 * @param stdCode 标准合约代码
	 * @param newTick 新的tick数据
	 */
	void	handle_push_quote(const char* stdCode, WTSTickData* newTick);

	/**
	 * @brief 获取委托队列数据切片
	 * @details 根据时间范围获取委托队列数据切片
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间
	 * @param etime 结束时间（0表示到最新）
	 * @return WTSOrdQueSlice* 委托队列数据切片
	 */
	WTSOrdQueSlice* get_order_queue_slice(const char* stdCode, uint64_t stime, uint64_t etime = 0);
	
	/**
	 * @brief 获取委托明细数据切片
	 * @details 根据时间范围获取委托明细数据切片
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间
	 * @param etime 结束时间（0表示到最新）
	 * @return WTSOrdDtlSlice* 委托明细数据切片
	 */
	WTSOrdDtlSlice* get_order_detail_slice(const char* stdCode, uint64_t stime, uint64_t etime = 0);
	
	/**
	 * @brief 获取逐笔成交数据切片
	 * @details 根据时间范围获取逐笔成交数据切片
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间
	 * @param etime 结束时间（0表示到最新）
	 * @return WTSTransSlice* 逐笔成交数据切片
	 */
	WTSTransSlice* get_transaction_slice(const char* stdCode, uint64_t stime, uint64_t etime = 0);

	/**
	 * @brief 按时间范围获取Tick数据切片
	 * @details 根据指定的时间范围获取Tick数据切片
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间
	 * @param etime 结束时间（0表示到最新）
	 * @return WTSTickSlice* Tick数据切片
	 */
	WTSTickSlice* get_tick_slices_by_range(const char* stdCode, uint64_t stime, uint64_t etime = 0);
	
	/**
	 * @brief 按时间范围获取K线数据切片
	 * @details 根据指定的时间范围获取K线数据切片
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param times 周期倍数
	 * @param stime 开始时间
	 * @param etime 结束时间（0表示到最新）
	 * @return WTSKlineSlice* K线数据切片
	 */
	WTSKlineSlice* get_kline_slice_by_range(const char* stdCode, WTSKlinePeriod period, uint32_t times, uint64_t stime, uint64_t etime = 0);

	/**
	 * @brief 按数量获取Tick数据切片
	 * @details 从指定结束时间向前获取指定数量的Tick数据切片
	 * @param stdCode 标准合约代码
	 * @param count 数据数量
	 * @param etime 结束时间（0表示最新）
	 * @return WTSTickSlice* Tick数据切片
	 */
	WTSTickSlice* get_tick_slices_by_count(const char* stdCode, uint32_t count, uint64_t etime = 0);
	
	/**
	 * @brief 按数量获取K线数据切片
	 * @details 从指定结束时间向前获取指定数量的K线数据切片
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param times 周期倍数
	 * @param count 数据数量
	 * @param etime 结束时间（0表示最新）
	 * @return WTSKlineSlice* K线数据切片
	 */
	WTSKlineSlice* get_kline_slice_by_count(const char* stdCode, WTSKlinePeriod period, uint32_t times, uint32_t count, uint64_t etime = 0);

private:
	IRdmDtReader*			_reader;		/*< 随机数据读取器 */
	FuncDeleteRdmDtReader	_remover;		/*< 数据读取器删除函数 */

	IBaseDataMgr*	_bd_mgr;		/*< 基础数据管理器 */
	IHotMgr*		_hot_mgr;		/*< 热点管理器 */
	WtDtRunner*		_runner;		/*< 数据运行器 */

	/**
	 * @struct _BarCache
	 * @brief K线缓存结构体
	 * @details 用于缓存K线数据，提高查询性能
	 */
	typedef struct _BarCache
	{
		WTSKlineData*	_bars;			/*< K线数据 */
		uint64_t		_last_bartime;	/*< 最后一根K线时间 */
		WTSKlinePeriod	_period;		/*< K线周期 */
		uint32_t		_times;			/*< 周期倍数 */

		_BarCache():_last_bartime(0),_period(KP_DAY),_times(1),_bars(NULL){}
	} BarCache;
	typedef faster_hashmap<std::string, BarCache>	BarCacheMap;
	BarCacheMap	_bars_cache;		/*< K线缓存映射表 */
};

NS_WTP_END